// import { reject, resolve } from 'core-js'

import { getNewCartGoods, mergeLocalCart, findCartList, insertCart, deleteCart, updateCart, checkAllCart } from '@/api/cart'
// import { get } from 'core-js/core/dict'
// 购物车状态
export default {
  namespaced: true,
  state () {
    return {
      // 购物车商品列表
      list: []
    }
  },
  getters: {
    // 有效商品列表
    validList (state) {
      // 拿掉有效商品 库存大于0 stock 有有效标识 isEffective
      return state.list.filter(good => good.stock > 0 && good.isEffective)
    },
    // 有效商品总件数
    validTotal (state, getters) {
      return getters.validList.reduce((p, c) => p + c.count, 0)
    },
    // 有效商品总金额
    validAmount (state, getters) {
      return getters.validList.reduce((p, c) => p + Math.round(100 * c.nowPrice) * c.count, 0) / 100
    },
    // 无效商品列表
    invalidList (state) {
      return state.list.filter(goods => goods.stock <= 0 || goods.isEffective === false)
    },
    // 已选商品列表
    selectedList (state, getters) {
      return getters.validList.filter(goods => goods.selected)
    },
    // 已选商品总件数
    selectedTotal (state, getters) {
      return getters.selectedList.reduce((p, c) => p + c.count, 0)
    },
    // 已选商品总金额
    selectedAmount (state, getters) {
      return getters.selectedList.reduce((p, c) => p + Math.round(100 * c.nowPrice) * c.count, 0) / 100
    },
    // 是否全选
    isCheckAll (state, getters) {
      return getters.validList.length !== 0 && (getters.selectedList.length === getters.validList.length)
    }
  },
  mutations: {
    // 加入购物车
    insertCart (state, payload) {
      // 需要哪些字段的约定 必须和客户端保持一致 就是payload对象字段
      // id,skuId,name,attrsText,picture,price,nowPrice,selected,stock,count,isEffective
      // 定义mutations方法
      // 插入数据的规则 先找相同的商品 有的话count++原来是商品删除 没有的话直接插入 最新加入的放在上面
      const sameIndex = state.list.findIndex(good => good.skuId === payload.skuId)
      if (sameIndex > -1) {
        const count = state.list[sameIndex].count
        payload.count += count
        // 删除原来的
        state.list.splice(sameIndex, 1)
      }
      state.list.unshift(payload)
    },
    // 修改购物车商品
    updateCart (state, goods) {
      // goods商品信息: newPrice stock isEffective
      // goods商品对象的字段是不固定的 对象中有哪些字段 就该哪些字段 字段的值合理才改
      // 找到待修改商品
      const updateGoods = state.list.find(item => item.skuId === goods.skuId)
      for (const key in goods) {
        if (goods[key] !== null && goods[key] !== undefined && goods[key] !== '') {
          updateGoods[key] = goods[key]
        }
      }
    },
    // 删除购物车
    deleteCart (state, skuId) {
      const index = state.list.findIndex(item => item.skuId === skuId)
      state.list.splice(index, 1)
    },
    // 设置购物车列表
    setCartList (state, list) {
      state.list = list
    }
  },
  actions: {
    // 加入购物车
    insertCart (context, payload) {
      return new Promise((resolve, reject) => {
        // 已登录
        // 少写一个profile去你码的
        if (context.rootState.user.profile.token) {
          // 已登录
          insertCart({ skuId: payload.skuId, count: payload.count }).then(() => {
            console.log(1)
            return findCartList()
          }).then((data) => {
            context.commit('setCartList', data.result)
            resolve()
          })
        } else {
        // 未登录
          context.commit('insertCart', payload)
          // promise 必须调用reslove 组件内可知调用是否成功
          resolve()
        }
      })
    },
    // 获取商品列表
    findCartList (ctx) {
      return new Promise((resolve, reject) => {
        if (ctx.rootState.user.profile.token) {
          // 已登录
          findCartList().then(data => {
            ctx.commit('setCartList', data.result)
          })
          resolve()
        } else {
          // 未登录
          // 同时发送请求(几件商品发几个请求) 一并修改本地数据
          // Promise.all(promise数组).then((dataList)=>{}) 同时发送请求 所有请求成功 得到所有结果
          // promise.resolve promise.reject new promise 创建promise对象的方法
          // promise.race(promise数组).then((data)=>{}) 一次发送多个请求 请求最快的那一个 得到成功结果
          const promiseArr = ctx.state.list.map(goods => {
            console.log(goods.skuId)
            return getNewCartGoods(goods.skuId)
          })
          Promise.all(promiseArr).then(dataList => {
            // console.log(results)
            dataList.forEach((data, index) => {
              ctx.commit('updateCart', { skuId: ctx.state.list[index].skuId, ...data.result })
            })
            // 更新本地购物车
            // 调用reslove方法代表操作成功
            resolve()
          })
        }
      })
    },
    // 删除购物车
    deleteCart (ctx, payload) {
      // paylo ad现在就是skuId 单条删除
      return new Promise((resolve, reject) => {
        if (ctx.rootState.user.profile.token) {
          // 已登录
          deleteCart([payload]).then(() => {
            return findCartList()
          }).then((data) => {
            ctx.commit('setCartList', data.result)
            resolve()
          })
        } else {
          // console.log(payload)
          ctx.commit('deleteCart', payload)
          resolve()
        }
      })
    },
    // 修改购物车 (选中状态 和数量)
    updateCart (ctx, payload) {
      // 必须有skuId 可能有selected 可能有count
      // console.log(payload)
      return new Promise((resolve, reject) => {
        if (ctx.rootState.user.profile.token) {
          // 已登录
          updateCart(payload).then(() => {
            return findCartList()
          }).then((data) => {
            ctx.commit('setCartList', data.result)
            resolve()
          })
        } else {
          // console.log(payload)
          ctx.commit('updateCart', payload)
          resolve()
        }
      })
    },
    // 做有效商品的全选&反选
    checkAllCart (ctx, selected) {
      // 必须有skuId 可能有selected 可能有count
      return new Promise((resolve, reject) => {
        if (ctx.rootState.user.profile.token) {
          // 已登录
          const ids = ctx.getters.validList.map(item => item.skuId)
          checkAllCart({ selected, ids }).then(() => {
            return findCartList()
          }).then((data) => {
            ctx.commit('setCartList', data.result)
            resolve()
          })
        } else {
          // 本地
          // 1. 获取有效的商品列表，遍历的去调用修改mutations即可
          ctx.getters.validList.forEach(item => {
            ctx.commit('updateCart', { skuId: item.skuId, selected })
          })
          // ctx.commit('updateCart', payload)
          resolve()
        }
      })
    },
    // 批量删除
    batchDeleteCart (ctx, isClear) {
      return new Promise((resolve, reject) => {
        if (ctx.rootState.user.profile.token) {
          // 已登录
          const ids = ctx.getters[isClear ? 'invalidList' : 'selectedList'].map(item => item.skuId)
          deleteCart(ids).then(() => {
            return findCartList()
          }).then((data) => {
            ctx.commit('setCartList', data.result)
            resolve()
          })
        } else {
          // 找出选中的商品列表 遍历删除的mutations方法
          ctx.getters[isClear ? 'invalidList' : 'selectedList'].forEach(item => {
            ctx.commit('deleteCart', item.skuId)
          })
          resolve()
        }
      })
    },
    // 修改规格
    updateCartSku (ctx, { oldSkuId, newSku }) {
      return new Promise((resolve, reject) => {
        if (ctx.rootState.user.profile.token) {
          // 已登录
          // 1.找出旧的商品信息
          // 2.删除旧的商品信息
          // 3.根据新的sku信息和旧的商品信息 合并成一条购物车商品 只需要skuid 和count就行了
          // 4.添加新的商品
          const oldGoods = ctx.state.list.find(item => item.skuId === oldSkuId)
          deleteCart([oldGoods.skuId]).then(() => {
            return insertCart({ skuId: newSku.skuId, count: oldGoods.count })
          }).then(() => {
            return findCartList()
          }).then((data) => {
            ctx.commit('setCartList', data.result)
            resolve()
          })
        } else {
          // 找出选中的商品列表 遍历删除的mutations方法
          // 1.找出旧的商品信息
          // 2.删除旧的商品信息
          // 3.根据新的sku信息和旧的商品信息 合并成一条购物车商品
          // 4.添加新的商品
          const oldGoods = ctx.state.list.find(item => item.skuId === oldSkuId)
          ctx.commit('deleteCart', oldSkuId)
          // console.log(newSku)
          const { skuId, price: nowPrice, specsText: attrsText, inventory: stock } = newSku
          const newGoods = { ...oldGoods, skuId, nowPrice, attrsText, stock }
          ctx.commit('insertCart', newGoods)
          resolve()
        }
      })
    },
    // 合并购物车
    async mergeLocalCart (ctx) {
      // 合并的参数
      // 存储token后调用合并API接口函数进行购物合并
      const cartList = ctx.state.list.map(goods => {
        return {
          skuId: goods.skuId,
          selected: goods.selected,
          count: goods.count
        }
      })
      await mergeLocalCart(cartList)
      // 合并成功
      // 清空本地 删除本地购物车
      ctx.commit('setCartList', [])
    }
  }
}
